package Modelo;

import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

import Persistencia.AdministradorPersistenciaFactura;

public class Factura {
	
	private int numerofactura;
	private Date periodo;
	private Float total;
	private Cliente usuario;
	private Vector<ItemFactura> itemsFact;
	private Vector<Consumo> consumos;
	
	public Factura (int numerofactura, Date mes, Float i, Cliente usuario) {
		this.numerofactura = numerofactura;
		this.periodo = mes;
		this.total = i;
		this.usuario = usuario;
		this.itemsFact = new Vector<ItemFactura>();
		this.consumos = new Vector<Consumo>();
	}
	
	public Factura () {
		this.numerofactura = 0;
		this.periodo = null;
		this.total = null;
		this.usuario = null;
		this.itemsFact = new Vector<ItemFactura>();
		this.consumos = new Vector<Consumo>();
	}	
	
	public int getCantidadItems(){
		return this.itemsFact.size();
	}
	
	public Factura facturarCliente(int nroFactura, Cliente cliente,Date mes){		
		Factura f = new Factura(nroFactura,mes,null,cliente);
		
		Vector<Consumo> consumosPeriodo = new Vector<Consumo>();
		float total = 0;
		
		for (Linea l: cliente.getLineas()){
			//comprobamos si es facturable
			if (l.isFacturable()){
				Vector<Consumo> consumosTotales = new Vector<Consumo>();
				float subMonto = 0; 
				
				//Normalizo los consumos, en consumos unicos (consumos totales)
				for (Consumo consumo:l.getConsumosDelPeriodo(mes, false)){
					consumosPeriodo.add(consumo);					
					if (existeServicioConsumido(consumosTotales, consumo.getServicio())){
						addConsumoAlTotal(consumosTotales, consumo);
					}
					else{
						consumosTotales.add(consumo);
					};					
					consumo.setFacturadoTrue();
				};			
				
				for (Consumo ct:consumosTotales){					
					subMonto = ct.getServicio().CalcularCosto(ct.getCantUnidadesCons()) * (1-getDescuentoPaquete (l.getPlan(),ct.getServicio()));
					f.addItemFactura(new ItemFactura(("Linea: " + l.getNumero() + " Plan: " + l.getPlan().getNombre() + " Tipo: " + l.getTipoLinea() + " Servicio: " + ct.getServicio().getNombre()),l, subMonto, ct));
					total += subMonto;			
				};
												
			};
							
		};
		
		f.setConsumos(consumosPeriodo);
		f.setTotal(total);
		
		if (f.getCantidadItems()>0){
			return f;
		}
		else{
			return null;					
		}
	};
	
	public float getDescuentoPaquete (Plan plan, Servicio servicio){
		for(Servicio s:plan.getServicios()){
			if (s.getTipo().equalsIgnoreCase("PAQUETE")){
				for(Servicio ss: ((PaquetedeServicios) s).getServicios()){
					if (ss.getNombre().equalsIgnoreCase(s.getNombre())){
						return ((PaquetedeServicios) s).getDescuento();
					}
				}
			}
		}
				
		return 0;
	}
	
	public void addConsumoAlTotal(Vector<Consumo> consumos, Consumo consumo){
		for(Consumo rConsumo:consumos){
			if (rConsumo.getServicio().equals(consumo.getServicio())){
				rConsumo.addUnidadesConsumidas(consumo.getCantUnidadesCons());
			}
		}
	}
	
	public boolean existeServicioConsumido(Vector<Consumo> consumos, Servicio servicio){
		for(Consumo consumo:consumos){
			if (consumo.getServicio().equals(servicio)){
				return true;
			}
		}
		return false;
	}
	
	public void altaFactura(Factura f)
	{
		AdministradorPersistenciaFactura.getInstancia().altaFactura(f);
	}

	public int getNumerofactura() {
		return numerofactura;
	}

	public Date getPeriodo() {
		return periodo;
	}

	public Float getTotal() {
		return total;
	}

	public Cliente getUsuario() {
		return usuario;
	}

	public Vector<ItemFactura> getItemsFact() {
		return itemsFact;
	}
	
	public void addItemFactura(ItemFactura item){
		this.itemsFact.add(item);
	}
	
	public void setTotal(Float t){
		this.total = t;
	}
	
	public void setConsumos(Vector<Consumo> consumos){
		this.consumos = consumos;
	}

}
